package com.cheifsteam.springframework.beans.factory.config;

import com.cheifsteam.springframework.beans.factory.HierarchicalBeanFactory;
import com.cheifsteam.springframework.utils.StringValueResolver;

/**
 * 可配置的Bean工厂接口。
 * 扩展了 HierarchicalBeanFactory 和 SingletonBeanRegistry 接口，
 * 提供了配置Bean工厂的能力，包括作用域管理、Bean后处理器注册等。
 */
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {

    /**
     * 单例作用域标识符："singleton"。
     * 表示Bean以单例模式创建，整个容器中只有一个实例。
     */
    String SCOPE_SINGLETON = "singleton";

    /**
     * 原型作用域标识符："prototype"。
     * 表示每次获取Bean时都会创建一个新的实例。
     */
    String SCOPE_PROTOTYPE = "prototype";

    /**
     * 添加一个Bean后处理器到工厂。
     * Bean后处理器可以在Bean初始化前后执行自定义逻辑。
     *
     * @param beanPostProcessor 要添加的后处理器
     */
    void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);

    /**
     * 销毁工厂中所有的单例Bean。
     * 通常在关闭应用上下文时调用，执行所有单例Bean的销毁方法。
     */
    void destroySingletons();

    /**
     * 添加一个嵌入式值解析器。
     * 嵌入式值解析器用于解析注解属性值中的占位符和表达式。
     *
     * @param valueResolver 要添加的值解析器
     */
    void addEmbeddedValueResolver(StringValueResolver valueResolver);

    /**
     * 解析给定的嵌入式值。
     * 例如解析属性值中的 ${...} 占位符或 #{...} SpEL表达式。
     *
     * @param value 包含要解析的占位符或表达式的原始值
     * @return 解析后的值
     */
    String resolveEmbeddedValue(String value);
}
